package day4;

/**
 * 引用变量有两个类型   一个是编译时类型 一个是运行时类型
 *
 * 编译时类型是声明该变量时使用的类型决定  运行时类型由实际赋给改变量的对象决定
 *
 * 如果编译时类型和运行时类型不一致 就可能出现多态
 *
 */

class Demo{

    public int book=6;

    public void base(){
        System.out.println("父类的普通方法");
    }

    public void test(){
        System.out.println("父类被覆盖的方法");
    }

}

public class Polymorphic extends Demo {


    public String book="php";


    public void test(){

        System.out.println("子类覆盖父类的方法");

    }



    public void sub(){

        System.out.println("子类的普通的方法");

    }


    public void run(){


        //下面编译时类型和运行时类型完全一样 因此不存在多态
        Demo demo = new Demo();

        System.out.println(demo.book);
        demo.base();
        demo.test();

        Polymorphic polymorphic = new Polymorphic();
        System.out.println(polymorphic.book);
        polymorphic.base();
        polymorphic.test();



        //下面编译时类型和运行时类型不一样，多态发生
        System.out.println("-----------------------");

        Demo good = new Polymorphic();
        System.out.println(good.book);
        good.base();
        good.test();



    }








}
